package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.Contract;
import cn.itcast.domain.cargo.ContractExample;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.service.cargo.ExtCproductService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.jws.soap.SOAPBinding;
import java.util.Date;
import java.util.List;

/**
 * 购销合同模块
 */
@Controller
@RequestMapping("/cargo/contract")
@Slf4j
public class ContractController extends BaseController {

    // 注入dubbo服务接口代理对象（注意导入的包）
    @Reference
    private ContractService contractService;

    /**
     * 列表
     *
     * @param pageNum  当前页，默认1
     * @param pageSize 页大小，默认5
     * @return 返回页面路径（前缀后缀在视图解析器中配置）
     */
    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") Integer pageNum,
                       @RequestParam(defaultValue = "5") Integer pageSize) {
        log.info("执行查询购销合同列表:");

        // 构造条件对象：根据企业id查询、创建时间降序排序
        ContractExample example = new ContractExample();
        // 降序排序
        example.setOrderByClause("create_time desc");
        ContractExample.Criteria criteria = example.createCriteria();
        criteria.andCompanyIdEqualTo(getLoginCompanyId());
        /**
         * 细粒度权限控制：
         *   1、对数据的访问控制
         *   2、不同等级(degree)的用户登陆后查看购销合同列表数据，看到的结果不一样
         *
         * User 中的 degree 用户的等级
         *    0-saas管理员
         *    1-企业管理员
         *    2-管理所有下属部门和人员
         *    3-管理本部门
         *    4-普通员工
         */
        // 获取登陆用户
        User user = getLoginUser();
        // 获取用户等级
        Integer degree = user.getDegree();
        PageInfo<Contract> pageInfo = null;
        // 判断
        if (degree == 4) {
            //A. 普通用户登陆，只能看到自己创建的购销合同. 查询条件：create_by
            // SELECT * FROM co_contract WHERE create_by=''
            criteria.andCreateByEqualTo(user.getId());
            pageInfo = contractService.findByPage(example, pageNum, pageSize);
        }
        else if (degree == 3) {
            //B. 部门经理登陆，可以看到本部门下的员工创建的购销合同。查询条件：create_dept
            // SELECT * FROM co_contract WHERE create_dept=''
            criteria.andCreateDeptEqualTo(user.getDeptId());
            pageInfo = contractService.findByPage(example, pageNum, pageSize);
        }
        else if (degree == 2) {
            //C. 大部门经理登陆（有子孙部门），可以看到所有子孙部门添加的购销合同
            //SELECT * FROM co_contract WHERE FIND_IN_SET(`create_dept`,getDeptChild('100'))
            pageInfo = contractService.findContractByDeptId(user.getDeptId(), pageNum, pageSize);
        }
        request.setAttribute("pageInfo", pageInfo);
        return "cargo/contract/contract-list";
    }

    /**
     * 进入添加页面
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        return "cargo/contract/contract-add";
    }

    /**
     * 添加或修改
     */
    @RequestMapping("/edit")
    public String edit(Contract contract) {
        // 设置企业信息（从登陆用户中获取）
        contract.setCompanyId(getLoginCompanyId());
        contract.setCompanyName(getLoginCompanyName());

        // 判断：根据id是否为空判断执行添加还是修改
        if (StringUtils.isEmpty(contract.getId())) {
            // 设置创建时间、创建人、创建人的部门
            contract.setCreateTime(new Date());
            contract.setCreateBy(getLoginUser().getId());
            contract.setCreateDept(getLoginUser().getDeptId());
            // 添加
            contractService.save(contract);
        } else {
            // 修改
            contractService.update(contract);
        }

        return "redirect:/cargo/contract/list";
    }

    /**
     * 进入修改页面
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id, Model model) {
        // 根据id查询
        Contract contract = contractService.findById(id);
        model.addAttribute("contract", contract);
        return "cargo/contract/contract-update";
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public String delete(String id) {
        contractService.delete(id);
        return "redirect:/cargo/contract/list";
    }

    /**
     * 查看、提交、取消
     * http://localhost:8080/cargo/contract/toView.do?id=1
     * http://localhost:8080/cargo/contract/submit.do?id=1
     * http://localhost:8080/cargo/contract/cancel.do?id=1
     */
    @RequestMapping("/toView")
    public String toView(String id) {
        // 根据id查询
        Contract contract = contractService.findById(id);
        request.setAttribute("contract",contract);
        return "cargo/contract/contract-view";
    }

    @RequestMapping("/submit")
    public String submit(String id) {
        // 提交：修改购销合同状态改为1
        Contract contract = new Contract();
        // 设置修改条件
        contract.setId(id);
        // 设置修改的状态值
        contract.setState(1);
        // 修改 (动态sql，有选择的修改)
        contractService.update(contract);
        return "redirect:/cargo/contract/list";
    }

    @RequestMapping("/cancel")
    public String cancel(String id) {
        // 取消：修改购销合同状态改为0
        Contract contract = new Contract();
        // 设置修改条件
        contract.setId(id);
        // 设置修改的状态值
        contract.setState(0);
        // 修改 (动态sql，有选择的修改)
        contractService.update(contract);
        return "redirect:/cargo/contract/list";
    }
}